package com.waitingresult.designpattern.behavioral.template.demo2;

import com.waitingresult.designpattern.domain.UserEntity;

/**
 * @Author: WangShuai
 * @CreateTime: 2022-11-15  22:10
 * @Description: 模板方法的抽象类, 负责提供 功能轮廓和骨架.
 * 由一个模板方法和若干个基本方法构成
 * 模板方法: 提供一些骨架实现,最小实现,按照某种顺序(一组业务) 顺序调用其包含的基本方法
 * 基本方法:
 * - 抽象方法: 抽象方法由抽象父类提供,有其子类进行具体实现
 * - 具体方法: 一个具体方法由一个抽象类或者具体类声明并实现,其子类可以进行覆盖也可以直接拿来使用(继承)
 * - 钩子方法: 在抽象类中实现,包括用于判断的逻辑方法和需要子类重写的空方法两种.
 * -- 一般钩子方法适用于判断逻辑的方法,这类方法一般命名为 isXXX,返回值类型为Boolean类型
 * 具体子类:
 * @Version: 1.0
 */
public abstract class AbsWorkingTemplate {

    /**
     * 模板方法中的 具体方法
     */
    public final void working(UserEntity user) {
        sleep(user);
        eat(user);
        go(user);
    }

    public void sleep(UserEntity user) {
        System.out.println(user.getName()+" 会睡觉");
    }

    public void wash(UserEntity user) {
        System.out.println(user.getName()+" 会洗漱");
    }

    public void eat(UserEntity user) {
        System.out.println(user.getName()+" 会吃饭");
    }

    public abstract void go(UserEntity user);

}
